package cn.net.msg.service.base;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.MatchMode;

public interface DAO {

    /**
     * 插入对象
     * 
     * @param entity
     * @return
     */
    public void save(Object entity);

    /**
     * 
     * 删除对象
     * 
     * 
     * 
     * @param entity
     */

    public void delete(Object entity);

    /**
     * 
     * 修改对象
     * 
     * 
     * 
     * @param entity
     */

    public void update(Object entity);

    /**
     * 
     * 根据ID查询对象 
     * id为long类型
     * 
     * 
     * @param entityClass
     * 
     *            类名,如:String.class
     * 
     * @param id
     * 
     *            ID值
     */

    public <T> T query(Class<T> entityClass, long id);

    /**
     * 
     * 根据ID查询对象 
     * id为int类型
     * 
     * 
     * @param entityClass
     * 
     *            类名,如:String.class
     * 
     * @param id
     * 
     *            ID值
     */
    public <T> T query(Class<T> entityClass, int id);

    /**
     * 
     * 查询全部
     * 
     * 
     * 
     * @param className
     * 
     *            类名
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public <T> List<T> queryAll(Class<?> className);

    /**
     * 
     * 分页
     * 
     * 
     * 
     * @param entityClass
     * 
     *            类名
     * 
     * @param index
     * 
     *            当前页数
     * 
     * @param size
     * 
     *            每页显示的大小
     * 
     * @param order
     * 
     *            排序类型
     * 
     * @param propertyName
     * 
     *            要排序的属性名
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public <T> List<T> paging(final Class<?> entityClass, final int index,
            final int size,final List<HashMap<String,Object>> queryParams, final Order order, final String... propertyName);


    @SuppressWarnings("unchecked")
    public long getSumRecord(final Class<?> className);

    /**
     * 
     * 获取总页数
     * 
     * 
     * 
     * @param className
     * 
     *            类名
     * 
     * @param size
     * 
     *            每页显示的大小
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public long sumPage(final Class<?> className, int size);

    /**
     * 
     * 根据字段查询
     * 
     * 
     * 
     * @param params
     * 
     *            字段列表
     * 
     * @param values
     * 
     *            值列表
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public <T> List<T> queryByProperty(final Class<?> className,

            final Map<String, Object> params);

    /**
     * 
     * 根据字段查询可以分的页数
     * 
     * 
     * 
     * @param className
     * 
     *            要查询的实体类
     * 
     * @param params
     * 
     *            属性列表
     * 
     * @param size
     * 
     *            每页显示的大小
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public long queryByPropertyGetSumPage(final Class<?> className,

            final Map<String, Object> params, final int size);

    /**
     * 
     * 获取总记录数根据属性
     * 
     * 
     * 
     * @param className
     * 
     * @param params
     * 
     * @param size
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public long queryByPropertyGetSumRecord(final Class<?> className,

            final Map<String, Object> params);

    /**
     * 
     * 根据字段查询并分页显示
     * 
     * 
     * 
     * @param className
     * 
     *            要分页的实体类
     * 
     * @param params
     * 
     *            字段列表
     * 
     * @param index
     * 
     *            当前页
     * 
     * @param size
     * 
     *            每页显示的大小
     * 
     * @param order
     * 
     *            排序
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public <T> List<T> queryByPropertyPaging(final Class<?> className,

            final Map<String, Object> params, final int index, final int size,

            final Order order, final String... field);

    /**
     * 
     * 保存或更新对象
     * 
     * 
     * 
     * @param entity
     * 
     *            对象
     */

    public void saveOrUpdate(Object entity);

    /**
     * 
     * 批量修改
     * 
     * 
     * 
     * @param queryString
     * 
     *            HQL语句
     * 
     * @return 受影响行数
     */

    public int bulkUpdate(String queryString);

    /**
     * 
     * 批量修改
     * 
     * 
     * 
     * @param queryString
     * 
     *            HQL语句
     * 
     * @param values
     * 
     *            参数的值
     * 
     * @return 受影响行数
     */

    public int bulkUpdate(String queryString, Object... values);

    /**
     * 
     * 批量删除
     * 
     * 
     * 
     * @param collection
     * 
     *            要删除的集合
     */

    public void deleteAll(Collection<?> collection);

    /**
     * 
     * 模糊查询
     * 
     * 
     * 
     * @param className
     * 
     *            类名
     * 
     * @param field
     * 
     *            字段名
     * 
     * @param value
     * 
     *            值
     * 
     * @param matchMode
     * 
     *            匹配模式:ANYWHERE->任意位置、END->结束、START->开始、EXACT->精确匹配
     */

    @SuppressWarnings("unchecked")
    public <T> List<T> Querylike(final Class<?> className, final String field,

            final String value, final MatchMode matchMode);

    /**
     * 
     * 执行hql查询语句
     * 
     * 
     * 
     * @param hql
     * 
     *            hql语句
     * 
     * @param values
     * 
     *            值列表
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public <T> Object executeQuery(final String hql,final int maxSize, final List<Object> values, final int firstResult,final int maxResult);

    /**
     * 
     * 查询单个值
     * 
     * 
     * 
     * @param hql
     * 
     *            hql语句
     * 
     * @param values
     * 
     *            参数列表
     * 
     * @return 返回单个值
     */

    @SuppressWarnings("unchecked")
    public <T> Object executeSacale(final String hql, final List<Object> values);

    /**
     * 
     * 执行hql删除、修改语句
     * 
     * 
     * 
     * @param hql
     * 
     *            hql语句
     * 
     * @param values
     * 
     *            值列表
     * 
     * @return
     */

    @SuppressWarnings("unchecked")
    public int executNonQuery(final String hql, final List<Object> values);

    /**
     * 
     * 删除表数据
     * 
     * @param tableName
     *            表名
     */

    @SuppressWarnings("unchecked")
    public void truncate(final String tableName);

    /**
     * 以下内容为满足执行原生sql语句需要，仅仅折针对相应功能编写的功能代码*/
    /**
     * 判断此人是否提交过分数，若未提交全球排名为-1
     * @param <T>
     * @param sql
     * @param values
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Object executeSumscoreNativeQuery(final String sql, long userid);

    /**
     * 获取全球排名
     * @param <T>
     * @param sql
     * @param values
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Object executeGobalRankNativeQuery(final String sql, long userid);

    /**
     * 获取考卷排名
     * @param <T>
     * @param sql
     * @param values
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Object executeExamRankNativeQuery(final String sql, long userid, String examFileid);

    /**
     * 获取热门收藏新闻原生sql
     * @param <T>
     * @param sql
     * @param index
     * @param size
     * @return
     */
    @SuppressWarnings("unchecked")
    public <T> Object executeGetPopFavouriteListNativeQuery(final String sql, final int index,
            final int size);
}
